///**
// * MemSessionFactoryImpl.java
// * Copyright © 2015-3015, 杭州泊享网络科技有限公司
// * 
// * @author Liu Tao
// * @create 2013-8-9
// */
//package com.pshare.session.impl.memcache;
//
//import java.util.concurrent.TimeoutException;
//
//import net.rubyeye.xmemcached.MemcachedClient;
//import net.rubyeye.xmemcached.exception.MemcachedException;
//
//import org.apache.commons.lang3.StringUtils;
//
//import com.pshare.session.Session;
//import com.pshare.session.SessionFactory;
//import com.pshare.session.Trackable;
//import com.pshare.session.impl.DefaultSessionImpl;
//import com.pshare.session.utils.UUIDUtil;
//
//
///**
// * 基于MemCached缓存机制的会话工厂实现类
// */
//public class MemSessionFactoryImpl implements SessionFactory {
//
//    private static final int DEFAULT_EXPIRE_TIME = 0;
//
//    /** MemCache缓存 */
//    private final MemcachedClient memClient;
//
//    /** 会话过期时间 */
//    private final int expireTime;
//
//    public MemSessionFactoryImpl(MemcachedClient memClient) {
//        this(memClient, DEFAULT_EXPIRE_TIME);
//    }
//
//    public MemSessionFactoryImpl(MemcachedClient memClient, int expireTime) {
//        super();
//        if (memClient == null)
//            throw new NullPointerException("memClient is null.");
//        if (expireTime < 0)
//            throw new RuntimeException("expireTime : " + expireTime);
//        this.memClient = memClient;
//        this.expireTime = expireTime;
//        this.memClient.setEnableHeartBeat(false);
//    }
//    
//	public Session newSession() {
//		Session session = this.createSession();
//		this.put(session);
//		return session;
//	}
//    
//    protected Session createSession() {
//        return new DefaultSessionImpl(UUIDUtil.getUUID(), this);
//    }
//    
//    protected Session createSession(String id) {
//        return new DefaultSessionImpl(id, this);
//    }
//
//    @Override
//    public Session getSession(Trackable trackable) {
//        if (trackable == null)
//            throw new NullPointerException("trackable is null.");
//        String trackId = trackable.getTrackId();
//        Session session = null;
//        if (StringUtils.isBlank(trackId)) {
//            session = this.createSession();
//            this.put(session);
//            return session;
//        }
//        session = this.getSession(trackable.getTrackId());
//        if (session == null) {
//            session = this.createSession(trackable.getTrackId());
//            this.put(session);
//            return session;
//        }
//        else {
//            session.setFactory(this);
//        }
//
//        return session;
//    }
//    
//    @Override
//    public Session readSession(Trackable trackable) {
//        if (trackable == null)
//            throw new NullPointerException("trackable is null.");
//        String trackId = trackable.getTrackId();
//        Session session = null;
//        if (StringUtils.isBlank(trackId)) {
//        	throw new NullPointerException("sessionId is null.");
//        }
//        session = this.getSession(trackable.getTrackId());
//        if (session != null) {
//        	session.setFactory(this);
//        }
//
//        return session;
//    }
//
//    /**
//     * <p>
//     * 根据追踪ID从MemCached缓存中获取会话对象。
//     * </p>
//     *
//     * @param trackId 追踪ID
//     * @param session
//     * @return Session
//     */
//    private Session getSession(String trackId) {
//    	Session session = null;
//        try {
//            if (StringUtils.isBlank(trackId))
//                throw new IllegalArgumentException("trackId is blank.");
//            session = memClient.get(trackId);
//        } catch (TimeoutException | InterruptedException | MemcachedException e) {
//            e.printStackTrace();
//        }
//        return session;
//    }
//
//    @Override
//    public void put(Session session) {
//        try {
//            if (session == null)
//                throw new NullPointerException("session is null.");
//            memClient.set(session.getId(), expireTime, session);
//        } catch (TimeoutException | InterruptedException | MemcachedException e) {
//            throw new RuntimeException(e);
//        }
//    }
//
//    @Override
//    public void remove(Trackable trackable) {
//        try {
//            if (trackable == null || StringUtils.isBlank(trackable.getTrackId()))
//                throw new IllegalArgumentException("trackable is null or trackId is blank.");
//            memClient.delete(trackable.getTrackId());
//        } catch (TimeoutException | InterruptedException | MemcachedException e) {
//        }
//    }
//
//    @Override
//    public void flush() {
//        try {
//            memClient.flushAll();
//        } catch (TimeoutException | InterruptedException | MemcachedException e) {
//            throw new RuntimeException(e);
//        }
//    }
//
//	@Override
//	public void putSessionId(String key, String sessionId) {
//		if(StringUtils.isBlank(key) || StringUtils.isBlank(sessionId)) {
//			throw new NullPointerException("sessionId is blank or key is blank.");
//		}
//		try {
//            memClient.set(key, expireTime, sessionId);
//        } catch (TimeoutException | InterruptedException | MemcachedException e) {
//            throw new RuntimeException(e);
//        }
//	}
//
//	@Override
//	public String getSessionId(String key) {
//		if (StringUtils.isBlank(key))
//            throw new IllegalArgumentException("trackId is blank.");
//    	String sessionId = null;
//        try {
//            sessionId = memClient.get(key);
//        } catch (TimeoutException | InterruptedException | MemcachedException e) {
//            e.printStackTrace();
//        }
//        return sessionId;
//	}
//
//	@Override
//	public void removeSessionId(String key) {
//        try {
//            if (StringUtils.isBlank(key))
//                throw new IllegalArgumentException("key is blank.");
//            memClient.delete(key);
//        } catch (TimeoutException | InterruptedException | MemcachedException e) {
//        }
//	}
//
//}
